package array;

import java.util.HashMap;
import java.util.Map;

/**
 * 森林中有未知数量的兔子。提问其中若干只兔子 "还有多少只兔子与你（指被提问的兔子）颜色相同?" ，将答案收集到一个整数数组 answers 中，其中
 * answers[i] 是第 i 只兔子的回答。
 * 给你数组 answers ，返回森林中兔子的最少数量。
 * <p>
 * 示例 1：
 * 输入：answers = [1,1,2]
 * 输出：5
 * 解释：
 * 两只回答了 "1" 的兔子可能有相同的颜色，设为红色。
 * 之后回答了 "2" 的兔子不会是红色，否则他们的回答会相互矛盾。
 * 设回答了 "2" 的兔子为蓝色。
 * 此外，森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
 * 因此森林中兔子的最少数量是 5 只：3 只回答的和 2 只没有回答的。
 * <p>
 * 示例 2：
 * 输入：answers = [10,10,10]
 * 输出：11
 *
 * @author Jisheng Huang
 * @version 20250420
 */
public class RabbitsInForest_781_2 {

    /**
     * Loop through the array and find the number of rabbits
     *
     * @param answers the given integer array
     * @return the number of rabbits in the forst
     */
    public static int numRabbits(int[] answers) {
        int ans = 0;
        Map<Integer, Integer> left = new HashMap<>();

        for (int x : answers) {
            int c = left.getOrDefault(x, 0);

            if (c == 0) {
                // 找到了一个大小为x + 1的颜色组
                ans += x + 1;
                // 允许其他x只兔子回答x
                left.put(x, x);
            } else {
                left.put(x, c - 1);
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 2};
        System.out.println(numRabbits(nums));

        nums = new int[]{10, 10, 10};
        System.out.println(numRabbits(nums));
    }
}
